package com.demo.demospringboot.service;

import com.demo.demospringboot.dto.LoginRequest;
import com.demo.demospringboot.dto.LoginResponse;
import com.demo.demospringboot.dto.RegisterRequest;
import com.demo.demospringboot.entity.User;
import com.demo.demospringboot.repository.UserRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.UUID;
import java.util.regex.Pattern;

/**
 * 用户服务类
 */
@Service
public class UserService {
  private static final Logger logger = LoggerFactory.getLogger(UserService.class);

  @Autowired
  private UserRepository userRepository;

  /**
   * 用户登录
   */
  public LoginResponse login(LoginRequest loginRequest) {
    logger.debug("开始执行用户登录业务逻辑 - 用户名: {}", loginRequest.getUsername());

    // 参数验证
    if (loginRequest.getUsername() == null || loginRequest.getUsername().trim().isEmpty()) {
      logger.warn("登录失败 - 用户名为空");
      return LoginResponse.failure("用户名不能为空");
    }

    if (loginRequest.getPassword() == null || loginRequest.getPassword().trim().isEmpty()) {
      logger.warn("登录失败 - 用户: {}, 密码为空", loginRequest.getUsername());
      return LoginResponse.failure("密码不能为空");
    }

    String username = loginRequest.getUsername().trim();
    String password = loginRequest.getPassword().trim();

    logger.debug("开始查询用户信息 - 用户名: {}", username);

    // 查询用户
    User user = userRepository.findByUsernameAndPassword(username, password);

    if (user == null) {
      logger.warn("登录失败 - 用户名或密码错误: {}", username);
      return LoginResponse.failure("用户名或密码错误");
    }

    logger.info("用户登录验证成功 - 用户ID: {}, 用户名: {}", user.getId(), username);

    // 生成简单的token（实际项目中应该使用JWT等更安全的方式）
    String token = UUID.randomUUID().toString();
    logger.debug("生成用户Token - 用户: {}, Token: {}", username, token);

    // 清除密码信息
    user.setPassword(null);
    logger.debug("清除用户密码信息 - 用户: {}", username);

    logger.info("用户登录业务逻辑执行完成 - 用户: {}", username);
    return LoginResponse.success("登录成功", user, token);
  }

  /**
   * 用户注册
   */
  public LoginResponse register(RegisterRequest registerRequest) {
    logger.debug("开始执行用户注册业务逻辑 - 用户名: {}, 邮箱: {}",
        registerRequest.getUsername(), registerRequest.getEmail());

    // 参数验证
    if (registerRequest.getUsername() == null || registerRequest.getUsername().trim().isEmpty()) {
      logger.warn("注册失败 - 用户名为空");
      return LoginResponse.failure("用户名不能为空");
    }

    if (registerRequest.getPassword() == null || registerRequest.getPassword().trim().isEmpty()) {
      logger.warn("注册失败 - 用户: {}, 密码为空", registerRequest.getUsername());
      return LoginResponse.failure("密码不能为空");
    }

    if (registerRequest.getConfirmPassword() == null || registerRequest.getConfirmPassword().trim().isEmpty()) {
      logger.warn("注册失败 - 用户: {}, 确认密码为空", registerRequest.getUsername());
      return LoginResponse.failure("确认密码不能为空");
    }

    if (!registerRequest.getPassword().equals(registerRequest.getConfirmPassword())) {
      logger.warn("注册失败 - 用户: {}, 两次密码不一致", registerRequest.getUsername());
      return LoginResponse.failure("两次输入的密码不一致");
    }

    if (registerRequest.getPassword().length() < 6) {
      logger.warn("注册失败 - 用户: {}, 密码长度不足6位", registerRequest.getUsername());
      return LoginResponse.failure("密码长度不能少于6位");
    }

    if (registerRequest.getEmail() == null || registerRequest.getEmail().trim().isEmpty()) {
      logger.warn("注册失败 - 用户: {}, 邮箱为空", registerRequest.getUsername());
      return LoginResponse.failure("邮箱不能为空");
    }

    // 简单的邮箱格式验证
    String emailPattern = "^[A-Za-z0-9+_.-]+@(.+)$";
    if (!Pattern.matches(emailPattern, registerRequest.getEmail().trim())) {
      logger.warn("注册失败 - 用户: {}, 邮箱格式不正确: {}",
          registerRequest.getUsername(), registerRequest.getEmail());
      return LoginResponse.failure("邮箱格式不正确");
    }

    if (registerRequest.getName() == null || registerRequest.getName().trim().isEmpty()) {
      logger.warn("注册失败 - 用户: {}, 姓名为空", registerRequest.getUsername());
      return LoginResponse.failure("姓名不能为空");
    }

    if (registerRequest.getAge() == null || registerRequest.getAge() < 1 || registerRequest.getAge() > 150) {
      logger.warn("注册失败 - 用户: {}, 年龄无效: {}",
          registerRequest.getUsername(), registerRequest.getAge());
      return LoginResponse.failure("年龄必须在1-150之间");
    }

    String username = registerRequest.getUsername().trim();
    String email = registerRequest.getEmail().trim();

    logger.debug("开始检查用户名是否已存在 - 用户名: {}", username);

    // 检查用户名是否已存在
    User existingUser = userRepository.findByUsername(username);
    if (existingUser != null) {
      logger.warn("注册失败 - 用户名已存在: {}", username);
      return LoginResponse.failure("用户名已存在");
    }

    logger.debug("开始检查邮箱是否已存在 - 邮箱: {}", email);

    // 检查邮箱是否已存在
    User existingEmail = userRepository.findByEmail(email);
    if (existingEmail != null) {
      logger.warn("注册失败 - 邮箱已被注册: {}", email);
      return LoginResponse.failure("邮箱已被注册");
    }

    logger.debug("开始创建新用户对象 - 用户名: {}, 邮箱: {}", username, email);

    // 创建新用户对象
    User user = new User();
    user.setUsername(username);
    user.setPassword(registerRequest.getPassword().trim());
    user.setEmail(email);
    user.setName(registerRequest.getName().trim());
    user.setAge(registerRequest.getAge());

    logger.debug("开始保存用户到数据库 - 用户名: {}", username);

    // 保存用户
    int result = userRepository.insertUser(user);
    if (result > 0) {
      logger.info("用户注册成功 - 用户ID: {}, 用户名: {}, 邮箱: {}",
          user.getId(), username, email);

      // 清除密码信息
      user.setPassword(null);
      String token = UUID.randomUUID().toString();
      logger.debug("生成用户Token - 用户: {}, Token: {}", username, token);

      logger.info("用户注册业务逻辑执行完成 - 用户: {}", username);
      return LoginResponse.success("注册成功", user, token);
    } else {
      logger.error("用户注册失败 - 数据库插入失败 - 用户名: {}", username);
      return LoginResponse.failure("注册失败，请稍后重试");
    }
  }
}